Cloud Scheduler の HTTP ターゲットで Cloud Run Function を呼び出してみた

Cloud Scheduler の HTTP ターゲットで Cloud Run Function を呼び出してみた

Clock Icon2024.10.06

Google Cloud データエンジニアのはんざわです。
今まで Pub/Sub を使用したイベントトリガーで起動していた Cloud Run Function(旧 Cloud Functions)を HTTP トリガーに変更したいケースがありました。
本ブログでは、Cloud Scheduler の HTTP ターゲットを使って、Cloud Run Function を呼び出す方法を紹介します。

やりたいこと

今回やりたいことは、以下のとおりです。

  1. Cloud Scheduler の HTTP ターゲットで Cloud Run Function を呼び出す
  2. HTTP トリガーの Cloud Run Function の呼び出しには認証が必要である
  3. Cloud Scheduler に適切な認証情報を設定する

やってみる

早速、検証してみたいと思います。
まずは、呼び出される Cloud Run Function をデプロイします。

Cloud Run Function をデプロイする

まずは、Cloud Run Function をデプロイします。

構成情報は以下のとおりで、それ以外は全てデフォルトの設定です。

  • 関数名:http-trigger-function
  • リージョン:asia-northeast1 (東京)
  • トリガー:HTTPS(認証が必要)
  • ランタイム:Python 3.12
  • ソースコードは、以下のとおりです
import functions_framework

@functions_framework.http
def hello_http(request):
    print('Function Started')

    request_json = request.get_json()
    name = request_json.get('name')
    print(f'Hello {name}!')

    print('Function Finished')

    return 'OK'

デプロイが完了したら、呼び出しに必要な URL をメモしておきます。

  • トリガー URL:https://asia-northeast1-<PROJECT_ID>.cloudfunctions.net/http-trigger-function

サービスアカウントの準備

次に、サービスアカウントを作成します。
まずは、以下のコマンドでサービスアカウントを作成します。

gcloud iam service-accounts create sa-call-function

このサービスアカウントが事前に作成した Cloud Run Function を呼び出せるように認証の設定をします。
以下のコマンドで、http-trigger-function 関数のリソース単位で roles/run.invoker の権限を割り当てます。

gcloud run services add-iam-policy-binding http-trigger-function \
  --member='serviceAccount:sa-call-function@<PROJECT_ID>.iam.gserviceaccount.com' \
  --role='roles/run.invoker' \
  --region='asia-northeast1'
  • 参考

https://cloud.google.com/run/docs/securing/managing-access?hl=ja

Cloud Scheduler の準備

最後に、Cloud Scheduler を作成します。

Cloud Run Function を呼び出す際には、OpenID Connect(OIDC)トークン、または ID トークンによる認証が必要になります。
つまり、呼び出し元である Cloud Scheduler は、HTTP リクエストのヘッダーに OIDC トークンを含める必要があります。

以下のコマンドで、HTTP ターゲットの Cloud Scheduler を作成します。

gcloud scheduler jobs create http exec-cloud-run-function \
  --location 'asia-northeast1' \
  --schedule '0 1 * * *' \
  --uri 'https://asia-northeast1-<PROJECT_ID>.cloudfunctions.net/http-trigger-function' \
  --headers 'content-type=application/json' \
  --http-method 'POST' \
  --time-zone 'Asia/Tokyo' \
  --message-body '{"name": "classmethod"}' \
  --oidc-service-account-email='sa-call-function@<PROJECT_ID>.iam.gserviceaccount.com'
  • 参考

https://cloud.google.com/docs/authentication/use-cases?hl=ja

https://cloud.google.com/scheduler/docs/http-target-auth?hl=ja

https://cloud.google.com/sdk/gcloud/reference/scheduler/jobs/create/http

実行してみる

作成した Cloud Scheduler を手動で実行し、Cloud Run Function を呼び出してみます。
以下のログのとおり、期待通りの結果が得られました。

スクリーンショット 2024-10-06 23.00.39

まとめ

今回のブログでは、Cloud Scheduler の HTTP ターゲットで Cloud Run Function を呼び出す方法を紹介しました。

イベントトリガーの Cloud Run Function と比較すると、HTTP トリガーの方が呼び出しの柔軟性が高く、関数の実行時間を長く設定できるというメリットがあります。」
一方で、イベントトリガーには、Cloud Storage のファイル配置など特定のイベントで呼び出せる点や、HTTP トリガーよりもセキュリティ設定が容易であるというメリットがあります。

それぞれのメリットとデメリットを理解した上で最適なトリガーを選択してみてください。

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.